{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<center>\n",
    "    <p style=\"text-align:center\">\n",
    "        <img alt=\"phoenix logo\" src=\"https://storage.googleapis.com/arize-phoenix-assets/assets/phoenix-logo-light.svg\" width=\"200\"/>\n",
    "        <br>\n",
    "        <a href=\"https://arize.com/docs/phoenix/\">Docs</a>\n",
    "        |\n",
    "        <a href=\"https://github.com/Arize-ai/phoenix\">GitHub</a>\n",
    "        |\n",
    "        <a href=\"https://arize-ai.slack.com/join/shared_invite/zt-2w57bhem8-hq24MB6u7yE_ZF_ilOYSBw#/shared-invite/email\">Community</a>\n",
    "    </p>\n",
    "</center>\n",
    "<h1 align=\"center\">Hallucination Classification Evals</h1>\n",
    "\n",
    "The purpose of this notebook is:\n",
    "\n",
    "- to evaluate the performance of an LLM-assisted approach to detecting hallucinations,\n",
    "- to provide an experimental framework for users to iterate and improve on the default classification template.\n",
    "\n",
    "## Install Dependencies and Import Libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "#####################\n",
    "## N_EVAL_SAMPLE_SIZE\n",
    "#####################\n",
    "# Eval sample size determines the run time\n",
    "# 100 samples: GPT-4 ~ 80 sec / GPT-3.5 ~ 40 sec\n",
    "# 1,000 samples: GPT-4 ~15-17 min / GPT-3.5 ~ 6-7min (depending on retries)\n",
    "# 10,000 samples GPT-4 ~170 min / GPT-3.5 ~ 70min\n",
    "N_EVAL_SAMPLE_SIZE = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "!pip install -qq \"arize-phoenix-evals>=0.0.5\" \"openai>=1\" ipython matplotlib pycm scikit-learn tiktoken nest_asyncio 'httpx<0.28'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "ℹ️ To enable async request submission in notebook environments like Jupyter or Google Colab, optionally use `nest_asyncio`. `nest_asyncio` globally patches `asyncio` to enable event loops to be re-entrant. This is not required for non-notebook environments.\n",
    "\n",
    "Without `nest_asyncio`, eval submission can be much slower, depending on your organization's rate limits. Speed increases of about 5x are typical."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import nest_asyncio\n",
    "\n",
    "nest_asyncio.apply()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "from getpass import getpass\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import openai\n",
    "import pandas as pd\n",
    "from pycm import ConfusionMatrix\n",
    "from sklearn.metrics import classification_report\n",
    "\n",
    "from phoenix.evals import (\n",
    "    HALLUCINATION_PROMPT_RAILS_MAP,\n",
    "    HALLUCINATION_PROMPT_TEMPLATE,\n",
    "    OpenAIModel,\n",
    "    download_benchmark_dataset,\n",
    "    llm_classify,\n",
    ")\n",
    "\n",
    "pd.set_option(\"display.max_colwidth\", None)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Download Benchmark Dataset\n",
    "\n",
    "We'll evaluate the evaluation system consisting of an LLM model and settings in addition to an evaluation prompt template against benchmark datasets of queries and retrieved documents with ground-truth relevance labels. Currently supported datasets include \"halueval_qa_data\" from the HaluEval benchmark:\n",
    "\n",
    "- https://arxiv.org/abs/2305.11747\n",
    "- https://github.com/RUCAIBox/HaluEval"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>reference</th>\n",
       "      <th>query</th>\n",
       "      <th>response</th>\n",
       "      <th>is_hallucination</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>() is a prefecture-level city in northwestern Anhui province, China.Gaozhou is a county-level city in southwestern Guangdong Province, China.</td>\n",
       "      <td>Can  Fuyang and Gaozhou be found in the same province?</td>\n",
       "      <td>no</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>() is a prefecture-level city in northwestern Anhui province, China.Gaozhou is a county-level city in southwestern Guangdong Province, China.</td>\n",
       "      <td>Can  Fuyang and Gaozhou be found in the same province?</td>\n",
       "      <td>Yes, Fuyang and Gaozhou are in the same province.</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>\"808\" was a success in the United States becoming the group's first top ten hit peaking at number eight on the \"Billboard\" Hot 100 and top five peaking at number four on the Hot R&amp;B/Hip-Hop Singles.The \"Billboard\" Hot 100 is the music industry standard record chart in the United States for singles, published weekly by \"Billboard\" magazine.</td>\n",
       "      <td>808 peaked at number eight on what?</td>\n",
       "      <td>Billboard\" Hot 100</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>\"808\" was a success in the United States becoming the group's first top ten hit peaking at number eight on the \"Billboard\" Hot 100 and top five peaking at number four on the Hot R&amp;B/Hip-Hop Singles.The \"Billboard\" Hot 100 is the music industry standard record chart in the United States for singles, published weekly by \"Billboard\" magazine.</td>\n",
       "      <td>808 peaked at number eight on what?</td>\n",
       "      <td>\"808\" peaked at number nine on \"Billboard\" Hot 100.</td>\n",
       "      <td>True</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>\"Arms\" then made a comeback in 2017 reaching #36 on the iTunes chart passing Auli'i Cravalho's \"How Far I'll Go\" from the Disney movie \"Moana\" (2017).Moana ( ) is a 2016 American 3D computer-animated musical fantasy-adventure film produced by Walt Disney Animation Studios and released by Walt Disney Pictures.</td>\n",
       "      <td>Arms is a song by American singer-songwriter Christina Perri, in 2017, it passed Auli'i Cravalho's, \"How Far I'll Go\" from which 2016, American 3D computer-animated Disney movie?</td>\n",
       "      <td>Moana</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                                                                                                                                                                                                                                                                                                                reference  \\\n",
       "0                                                                                                                                                                                                           () is a prefecture-level city in northwestern Anhui province, China.Gaozhou is a county-level city in southwestern Guangdong Province, China.   \n",
       "1                                                                                                                                                                                                           () is a prefecture-level city in northwestern Anhui province, China.Gaozhou is a county-level city in southwestern Guangdong Province, China.   \n",
       "2   \"808\" was a success in the United States becoming the group's first top ten hit peaking at number eight on the \"Billboard\" Hot 100 and top five peaking at number four on the Hot R&B/Hip-Hop Singles.The \"Billboard\" Hot 100 is the music industry standard record chart in the United States for singles, published weekly by \"Billboard\" magazine.   \n",
       "3   \"808\" was a success in the United States becoming the group's first top ten hit peaking at number eight on the \"Billboard\" Hot 100 and top five peaking at number four on the Hot R&B/Hip-Hop Singles.The \"Billboard\" Hot 100 is the music industry standard record chart in the United States for singles, published weekly by \"Billboard\" magazine.   \n",
       "4                                  \"Arms\" then made a comeback in 2017 reaching #36 on the iTunes chart passing Auli'i Cravalho's \"How Far I'll Go\" from the Disney movie \"Moana\" (2017).Moana ( ) is a 2016 American 3D computer-animated musical fantasy-adventure film produced by Walt Disney Animation Studios and released by Walt Disney Pictures.   \n",
       "\n",
       "                                                                                                                                                                                query  \\\n",
       "0                                                                                                                              Can  Fuyang and Gaozhou be found in the same province?   \n",
       "1                                                                                                                              Can  Fuyang and Gaozhou be found in the same province?   \n",
       "2                                                                                                                                                 808 peaked at number eight on what?   \n",
       "3                                                                                                                                                 808 peaked at number eight on what?   \n",
       "4  Arms is a song by American singer-songwriter Christina Perri, in 2017, it passed Auli'i Cravalho's, \"How Far I'll Go\" from which 2016, American 3D computer-animated Disney movie?   \n",
       "\n",
       "                                              response  is_hallucination  \n",
       "0                                                   no             False  \n",
       "1    Yes, Fuyang and Gaozhou are in the same province.              True  \n",
       "2                                   Billboard\" Hot 100             False  \n",
       "3  \"808\" peaked at number nine on \"Billboard\" Hot 100.              True  \n",
       "4                                                Moana             False  "
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = download_benchmark_dataset(\n",
    "    task=\"binary-hallucination-classification\", dataset_name=\"halueval_qa_data\"\n",
    ")\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Display Binary Hallucination Classification Template\n",
    "\n",
    "View the default template used to classify hallucinations. You can tweak this template and evaluate its performance relative to the default."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "In this task, you will be presented with a query, a reference text and an answer. The answer is\n",
      "generated to the question based on the reference text. The answer may contain false information. You\n",
      "must use the reference text to determine if the answer to the question contains false information,\n",
      "if the answer is a hallucination of facts. Your objective is to determine whether the answer text\n",
      "contains factual information and is not a hallucination. A 'hallucination' refers to\n",
      "an answer that is not based on the reference text or assumes information that is not available in\n",
      "the reference text. Your response should be a single word: either \"factual\" or \"hallucinated\", and\n",
      "it should not include any other text or characters. \"hallucinated\" indicates that the answer\n",
      "provides factually inaccurate information to the query based on the reference text. \"factual\"\n",
      "indicates that the answer to the question is correct relative to the reference text, and does not\n",
      "contain made up information. Please read the query and reference text carefully before determining\n",
      "your response.\n",
      "\n",
      "    [BEGIN DATA]\n",
      "    ************\n",
      "    [Query]: {input}\n",
      "    ************\n",
      "    [Reference text]: {reference}\n",
      "    ************\n",
      "    [Answer]: {output}\n",
      "    ************\n",
      "    [END DATA]\n",
      "\n",
      "    Is the answer above factual or hallucinated based on the query and reference text?\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(HALLUCINATION_PROMPT_TEMPLATE)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Template variables:\n",
    "- **input** : The question or prompt asked on the context data.\n",
    "- **reference** : The context data used to answer the question\n",
    "- **output** : The answer generated from the context data, we are checking this answer for halluciations relative to the reference context"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Configure the LLM\n",
    "\n",
    "Configure your OpenAI API key."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "if not (openai_api_key := os.getenv(\"OPENAI_API_KEY\")):\n",
    "    openai_api_key = getpass(\"🔑 Enter your OpenAI API key: \")\n",
    "openai.api_key = openai_api_key\n",
    "os.environ[\"OPENAI_API_KEY\"] = openai_api_key"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Benchmark Dataset Sample\n",
    "Sample size determines run time\n",
    "Recommend iterating small: 100 samples\n",
    "Then increasing to large test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "df = (\n",
    "    df.sample(n=N_EVAL_SAMPLE_SIZE)\n",
    "    .reset_index(drop=True)\n",
    "    .rename(columns={\"query\": \"input\", \"response\": \"output\"})\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LLM Evals: hallucination Classifications GPT-4\n",
    "Run hallucination against a subset of the data."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Instantiate the LLM and set parameters."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
     ]
    }
   ],
   "source": [
    "model = OpenAIModel(\n",
    "    model_name=\"gpt-4\",\n",
    "    temperature=0.0,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"Hello! I'm working perfectly. How can I assist you today?\""
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model(\"Hello world, this is a test if you are working?\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "14ea0322570e48979f83ac4f87036ac0",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# The rails fore the output to specific values of the template\n",
    "# It will remove text such as \",,,\" or \"...\", anything not the\n",
    "# binary value expected from the template\n",
    "rails = list(HALLUCINATION_PROMPT_RAILS_MAP.values())\n",
    "hallucination_classifications = llm_classify(\n",
    "    dataframe=df, template=HALLUCINATION_PROMPT_TEMPLATE, model=model, rails=rails, concurrency=20\n",
    ")[\"label\"].tolist()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "Evaluate the predictions against human-labeled ground-truth hallucination labels."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "hallucinated       0.95      0.78      0.86        50\n",
      "     factual       0.81      0.96      0.88        50\n",
      "\n",
      "    accuracy                           0.87       100\n",
      "   macro avg       0.88      0.87      0.87       100\n",
      "weighted avg       0.88      0.87      0.87       100\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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QETZEJMhIiIiUiOmCdScM0RERESixsoQERERqZFAB6vJdBJJ0WMyRERERGpENGWIw2REREQkbqwMERERkRox3XSRyRARERFpIJ6BMg6TERERkaixMkRERERqOExGREREoiaeQTIOkxEREZHIsTJEREREajhMRkRERKImpmeTMRkiIiIidSKaNMQ5Q0RERCRqrAwRERGRGhEVhpgMERERkToxTaDmMBkRERGJGitDREREpIaryYiIiEjcRDRpiMNkREREJGqsDBEREZEaERWGmAwRERGROq4mIyIiIhIJVoaIiIhIg8KvJistA2VMhoiIiEgNh8mIiIiIRILJEBEREYkah8mIiIhIjZiGyZgMERERkRoxPY6Dw2REREQkaqwMERERkRoOkxEREZGoielxHBwmIyIiIlFjZYiIiIjUiag0xGSIiIiI1HA1GREREZFIsDJEREREariajIiIiERNRFOGmAwRERGRBiLKhjhniIiIiESNlSEiIiJSI6bVZEyGiIiISA0nUNNHSxAEAEB6WloJR0JUdAR5dkmHQFRk8r6/836eF5U0Hfye0EUfxYHJkMikp6cDANwqOZVwJEREVBjp6emwtLTUeb+GhoZwcHCAu45+Tzg4OMDQ0FAnfRUViVDUqSV9UBQKBR4+fAhzc3NISkv9shRLS0uDk5MT4uPjYWFhUdLhEOkcv8eLnyAISE9PR7ly5SCVFs06qJcvXyI7WzcVVkNDQxgZGemkr6LCypDISKVSVKhQoaTDEB0LCwv+oqCPGr/Hi1dRVIReZ2Rk9MEnMLrEpfVEREQkakyGiIiISNSYDBEVIZlMhuDgYMhkspIOhahI8HucPgacQE1ERESixsoQERERiRqTISIiIhI1JkNEREQkakyGqFRr0aIFhg8f/t7HR0REwMrKSvk+JCQEtWvXLnRceaKioiCRSPD06VOd9alrEokEu3btKukwqIgJgoABAwbAxsYGEokE0dHRJR1SvgICAuDr61vSYZCIMBkiKkJNmjRBQkKCzm+QxgSGtBUZGYmIiAjs3r0bCQkJqFGjRqH60/UfDkQliXegJipCec/4ISppd+7cgaOjI5o0aVLSoRB9cFgZolJPoVBgzJgxsLGxgYODA0JCQpTb5syZAw8PD5iamsLJyQmDBw9GRkZGgfvWNAzn6+uLgIAA5fusrCyMHTsWTk5OkMlk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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "true_labels = df[\"is_hallucination\"].map(HALLUCINATION_PROMPT_RAILS_MAP).tolist()\n",
    "print(classification_report(true_labels, hallucination_classifications, labels=rails))\n",
    "confusion_matrix = ConfusionMatrix(\n",
    "    actual_vector=true_labels,\n",
    "    predict_vector=hallucination_classifications,\n",
    "    classes=rails,\n",
    ")\n",
    "confusion_matrix.plot(\n",
    "    cmap=plt.colormaps[\"Blues\"],\n",
    "    number_label=True,\n",
    "    normalized=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Classifications with explanations\n",
    "\n",
    "When evaluating a dataset for hallucinations, it can be useful to know why the LLM classified a response as a hallucination or not. The following code block runs `llm_classify` with explanations turned on so that we can inspect why the LLM made the classification it did. There is speed tradeoff since more tokens is being generated but it can be highly informative when troubleshooting."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Using prompt:\n",
      "\n",
      "\n",
      "In this task, you will be presented with a query, a reference text and an answer. The answer is\n",
      "generated to the question based on the reference text. The answer may contain false information. You\n",
      "must use the reference text to determine if the answer to the question contains false information,\n",
      "if the answer is a hallucination of facts. Your objective is to determine whether the answer text\n",
      "contains factual information and is not a hallucination. A 'hallucination' refers to\n",
      "an answer that is not based on the reference text or assumes information that is not available in\n",
      "the reference text.\n",
      "\n",
      "    [BEGIN DATA]\n",
      "    ************\n",
      "    [Query]: {input}\n",
      "    ************\n",
      "    [Reference text]: {reference}\n",
      "    ************\n",
      "    [Answer]: {output}\n",
      "    ************\n",
      "    [END DATA]\n",
      "\n",
      "    Is the answer above factual or hallucinated based on the query and reference text?\n",
      "\n",
      "Please read the query, reference text and answer carefully, then write out in a step by step manner\n",
      "an EXPLANATION to show how to determine if the answer is \"factual\" or \"hallucinated\". Avoid simply\n",
      "stating the correct answer at the outset. Your response LABEL should be a single word: either\n",
      "\"factual\" or \"hallucinated\", and it should not include any other text or characters. \"hallucinated\"\n",
      "indicates that the answer provides factually inaccurate information to the query based on the\n",
      "reference text. \"factual\" indicates that the answer to the question is correct relative to the\n",
      "reference text, and does not contain made up information.\n",
      "\n",
      "Example response:\n",
      "************\n",
      "EXPLANATION: An explanation of your reasoning for why the label is \"factual\" or \"hallucinated\"\n",
      "LABEL: \"factual\" or \"hallucinated\"\n",
      "************\n",
      "\n",
      "EXPLANATION:\n",
      "OpenAI invocation parameters: {'model': 'gpt-4', 'temperature': 0.0, 'max_tokens': 256, 'frequency_penalty': 0, 'presence_penalty': 0, 'top_p': 1, 'n': 1, 'timeout': None}\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "d6a8248990b44ba28037bf046a9097f1",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "llm_classify |          | 0/5 (0.0%) | ⏳ 00:00<? | ?it/s"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "- Snapped 'hallucinated' to rail: hallucinated\n",
      "- Snapped 'factual' to rail: factual\n",
      "- Snapped 'factual' to rail: factual\n",
      "- Snapped 'hallucinated' to rail: hallucinated\n",
      "- Snapped 'hallucinated' to rail: hallucinated\n"
     ]
    }
   ],
   "source": [
    "small_df_sample = df.copy().sample(n=5).reset_index(drop=True)\n",
    "hallucination_classifications_df = llm_classify(\n",
    "    dataframe=small_df_sample,\n",
    "    template=HALLUCINATION_PROMPT_TEMPLATE,\n",
    "    model=model,\n",
    "    rails=rails,\n",
    "    provide_explanation=True,\n",
    "    verbose=True,\n",
    "    concurrency=20,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>input</th>\n",
       "      <th>reference</th>\n",
       "      <th>output</th>\n",
       "      <th>is_hallucination</th>\n",
       "      <th>label</th>\n",
       "      <th>explanation</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>What fraudulent company was listed on both the Alberta Stock Exchange and the Toronto Stock Exchange?</td>\n",
       "      <td>The Alberta Stock Exchange (ASE) was a stock exchange based in Calgary, Alberta established in 1913. The ASE was the original listing exchange for Bre-X, one of the biggest corporate frauds in Canadian history. Bre-X bought the Busang site in March 1993 and in October 1995 announced significant amounts of gold had been discovered, sending its stock price soaring. Originally a penny stock, its stock price reached a peak at CAD $286.50 (split adjusted) in May 1996 on the Toronto Stock Exchange (TSE), with a total capitalization of over CAD $6 billion.</td>\n",
       "      <td>The ASE did not list any fraudulent company.</td>\n",
       "      <td>True</td>\n",
       "      <td>hallucinated</td>\n",
       "      <td>The query asks for the fraudulent company that was listed on both the Alberta Stock Exchange and the Toronto Stock Exchange. The reference text clearly states that Bre-X, a company involved in one of the biggest corporate frauds in Canadian history, was originally listed on the Alberta Stock Exchange and its stock price reached a peak on the Toronto Stock Exchange. However, the answer states that the ASE did not list any fraudulent company, which contradicts the information provided in the reference text.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>\"Simple Song #3\" is the lead single from a 2015 Italian comedy film set where?</td>\n",
       "      <td>\"Simple Song#3\" or \"Simple Song Number 3\" is an original song sung by South Korean singer Sumi Jo. It is the director's second English language film, and stars Michael Caine and Harvey Keitel as best friends who reflect on their lives while holidaying in the Swiss Alps.</td>\n",
       "      <td>\"Simple Song #3\" is a lead single from a 2015 Italian comedy film set in the Caribbean.</td>\n",
       "      <td>True</td>\n",
       "      <td>hallucinated</td>\n",
       "      <td>The reference text states that the film, which features the song 'Simple Song #3', is set in the Swiss Alps. However, the answer claims that the film is set in the Caribbean. This is a contradiction, and therefore the answer is not factual based on the reference text.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>What is the name of the business connected to the Treasure Island Hotel and Casino that is owned by General Growth Properties Inc?</td>\n",
       "      <td>Treasure Island Hotel &amp; Casino (also known as \"TI\") is a hotel and casino located on the Las Vegas Strip in Paradise, Nevada, USA with 2,664 rooms and 220 suites, and is connected by tram to The Mirage as well as pedestrian bridge to the Fashion Show Mall shopping center.Fashion Show Mall is a shopping mall located on the Las Vegas Strip in Paradise, Nevada, and is owned by General Growth Properties Inc. The mall spans 1888151 sqft of space, with more than 250 stores and seven anchors, and hosts weekend fashion shows on a retractable runway with the mall's central atrium, hence the name.</td>\n",
       "      <td>Fashion Show Mall</td>\n",
       "      <td>False</td>\n",
       "      <td>factual</td>\n",
       "      <td>The query asks for the name of the business connected to the Treasure Island Hotel and Casino that is owned by General Growth Properties Inc. The reference text mentions that the Treasure Island Hotel &amp; Casino is connected by a pedestrian bridge to the Fashion Show Mall shopping center, which is owned by General Growth Properties Inc. Therefore, the answer 'Fashion Show Mall' is based on the information provided in the reference text.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Charles Wallace Murray is a major character in a fantasy/science fiction series of how many young adult novels written by Madeleine L'Engle?</td>\n",
       "      <td>Charles Wallace Murry is a major character in Madeleine L'Engle's Time Quintet series of young adult science fiction novels.The Time Quintet is a fantasy/science fiction series of five young adult novels written by Madeleine L'Engle.</td>\n",
       "      <td>five</td>\n",
       "      <td>False</td>\n",
       "      <td>factual</td>\n",
       "      <td>The query asks for the number of young adult novels in the fantasy/science fiction series by Madeleine L'Engle in which Charles Wallace Murry is a major character. The reference text clearly states that Charles Wallace Murry is a major character in the Time Quintet series by Madeleine L'Engle, which consists of five young adult novels. Therefore, the answer 'five' is directly supported by the reference text.</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>In which city is the headquarters of the company which John Schnatter is a spokesman of located in?</td>\n",
       "      <td>John H. Schnatter (born November 22, 1961) is an American entrepreneur and the founder, CEO, and spokesman of Papa John's International, Inc. It runs the third largest take-out and pizza delivery restaurant chain in the United States, with headquarters in Jeffersontown, Kentucky, a suburb of Louisville.</td>\n",
       "      <td>The headquarters is located in Kentucky.</td>\n",
       "      <td>True</td>\n",
       "      <td>hallucinated</td>\n",
       "      <td>The query asks for the city where the headquarters of the company that John Schnatter is a spokesman for is located. The reference text states that the headquarters of Papa John's International, Inc., the company for which John Schnatter is a spokesman, is in Jeffersontown, Kentucky. The answer states that the headquarters is located in Kentucky. While this is technically true, it does not fully answer the query, which specifically asks for the city. Therefore, the answer is not entirely factual.</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                                                                                                          input  \\\n",
       "0                                         What fraudulent company was listed on both the Alberta Stock Exchange and the Toronto Stock Exchange?   \n",
       "1                                                               \"Simple Song #3\" is the lead single from a 2015 Italian comedy film set where?    \n",
       "2            What is the name of the business connected to the Treasure Island Hotel and Casino that is owned by General Growth Properties Inc?   \n",
       "3  Charles Wallace Murray is a major character in a fantasy/science fiction series of how many young adult novels written by Madeleine L'Engle?   \n",
       "4                                           In which city is the headquarters of the company which John Schnatter is a spokesman of located in?   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            reference  \\\n",
       "0                                         The Alberta Stock Exchange (ASE) was a stock exchange based in Calgary, Alberta established in 1913. The ASE was the original listing exchange for Bre-X, one of the biggest corporate frauds in Canadian history. Bre-X bought the Busang site in March 1993 and in October 1995 announced significant amounts of gold had been discovered, sending its stock price soaring. Originally a penny stock, its stock price reached a peak at CAD $286.50 (split adjusted) in May 1996 on the Toronto Stock Exchange (TSE), with a total capitalization of over CAD $6 billion.   \n",
       "1                                                                                                                                                                                                                                                                                                                                      \"Simple Song#3\" or \"Simple Song Number 3\" is an original song sung by South Korean singer Sumi Jo. It is the director's second English language film, and stars Michael Caine and Harvey Keitel as best friends who reflect on their lives while holidaying in the Swiss Alps.   \n",
       "2  Treasure Island Hotel & Casino (also known as \"TI\") is a hotel and casino located on the Las Vegas Strip in Paradise, Nevada, USA with 2,664 rooms and 220 suites, and is connected by tram to The Mirage as well as pedestrian bridge to the Fashion Show Mall shopping center.Fashion Show Mall is a shopping mall located on the Las Vegas Strip in Paradise, Nevada, and is owned by General Growth Properties Inc. The mall spans 1888151 sqft of space, with more than 250 stores and seven anchors, and hosts weekend fashion shows on a retractable runway with the mall's central atrium, hence the name.   \n",
       "3                                                                                                                                                                                                                                                                                                                                                                           Charles Wallace Murry is a major character in Madeleine L'Engle's Time Quintet series of young adult science fiction novels.The Time Quintet is a fantasy/science fiction series of five young adult novels written by Madeleine L'Engle.   \n",
       "4                                                                                                                                                                                                                                                                                                    John H. Schnatter (born November 22, 1961) is an American entrepreneur and the founder, CEO, and spokesman of Papa John's International, Inc. It runs the third largest take-out and pizza delivery restaurant chain in the United States, with headquarters in Jeffersontown, Kentucky, a suburb of Louisville.   \n",
       "\n",
       "                                                                                    output  \\\n",
       "0                                             The ASE did not list any fraudulent company.   \n",
       "1  \"Simple Song #3\" is a lead single from a 2015 Italian comedy film set in the Caribbean.   \n",
       "2                                                                        Fashion Show Mall   \n",
       "3                                                                                     five   \n",
       "4                                                 The headquarters is located in Kentucky.   \n",
       "\n",
       "   is_hallucination         label  \\\n",
       "0              True  hallucinated   \n",
       "1              True  hallucinated   \n",
       "2             False       factual   \n",
       "3             False       factual   \n",
       "4              True  hallucinated   \n",
       "\n",
       "                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      explanation  \n",
       "0  The query asks for the fraudulent company that was listed on both the Alberta Stock Exchange and the Toronto Stock Exchange. The reference text clearly states that Bre-X, a company involved in one of the biggest corporate frauds in Canadian history, was originally listed on the Alberta Stock Exchange and its stock price reached a peak on the Toronto Stock Exchange. However, the answer states that the ASE did not list any fraudulent company, which contradicts the information provided in the reference text.  \n",
       "1                                                                                                                                                                                                                                                    The reference text states that the film, which features the song 'Simple Song #3', is set in the Swiss Alps. However, the answer claims that the film is set in the Caribbean. This is a contradiction, and therefore the answer is not factual based on the reference text.  \n",
       "2                                                                          The query asks for the name of the business connected to the Treasure Island Hotel and Casino that is owned by General Growth Properties Inc. The reference text mentions that the Treasure Island Hotel & Casino is connected by a pedestrian bridge to the Fashion Show Mall shopping center, which is owned by General Growth Properties Inc. Therefore, the answer 'Fashion Show Mall' is based on the information provided in the reference text.  \n",
       "3                                                                                                     The query asks for the number of young adult novels in the fantasy/science fiction series by Madeleine L'Engle in which Charles Wallace Murry is a major character. The reference text clearly states that Charles Wallace Murry is a major character in the Time Quintet series by Madeleine L'Engle, which consists of five young adult novels. Therefore, the answer 'five' is directly supported by the reference text.  \n",
       "4           The query asks for the city where the headquarters of the company that John Schnatter is a spokesman for is located. The reference text states that the headquarters of Papa John's International, Inc., the company for which John Schnatter is a spokesman, is in Jeffersontown, Kentucky. The answer states that the headquarters is located in Kentucky. While this is technically true, it does not fully answer the query, which specifically asks for the city. Therefore, the answer is not entirely factual.  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Let's view the data\n",
    "merged_df = pd.merge(\n",
    "    small_df_sample, hallucination_classifications_df, left_index=True, right_index=True\n",
    ")\n",
    "merged_df[[\"input\", \"reference\", \"output\", \"is_hallucination\", \"label\", \"explanation\"]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## LLM Evals: hallucination Classifications GPT-3.5\n",
    "Run hallucination against a subset of the data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
     ]
    }
   ],
   "source": [
    "model = OpenAIModel(model_name=\"gpt-3.5-turbo\", temperature=0.0, request_timeout=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "179dbf669839492abec15fcfe151a524",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "rails = list(HALLUCINATION_PROMPT_RAILS_MAP.values())\n",
    "hallucination_classifications = llm_classify(\n",
    "    dataframe=df, template=HALLUCINATION_PROMPT_TEMPLATE, model=model, rails=rails, concurrency=20\n",
    ")[\"label\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "hallucinated       0.84      0.72      0.77        50\n",
      "     factual       0.75      0.86      0.80        50\n",
      "\n",
      "    accuracy                           0.79       100\n",
      "   macro avg       0.80      0.79      0.79       100\n",
      "weighted avg       0.80      0.79      0.79       100\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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9+/H/fv3cfbsWYwfPx7fffedyvOcnZ3llZ9r165h6NChSE1Nle8/deoUZsyYgbNnzyIxMRHbt29Heno6GjdujHv37mHixIk4ceIEHjx4gL179+LWrVto3LgxACA4OBi//vorQkNDceXKFVy7dg2bNm3ClClTAADR0dFYuXIlLl++jLt372LdunUwMDCAg4NDib6nRFSEyp60RETl7/UJ1OrsT05OFvz8/AQrKytBT09PqFevnjB48GDh6dOngiC8mjA9atQowdTUVDA3NxeCgoIEPz+/IidQC4IgPH/+XPjhhx8EOzs7QSKRCE5OTsKqVavk+8PCwgRbW1tBJBIJ/v7+giC8mvQdGRkpNGzYUNDV1RWsra2Frl27CocOHZKf9+effwpOTk6Cnp6e0KFDB2HVqlVvnfgsCIJw5swZoW/fvoK1tbWgp6cnODk5CUOGDBFu3bolCILyBOrMzEyhd+/egrGxsVCjRg1hypQpCvd89epVoWvXrvL+GjRoICxatEgQBEFISUkRfHx85Pfu4OAgBAcHC1KpVB5PTEyM0K5dO8HAwEAwNTUVWrduLSxfvlwQBEHYsWOH0KZNG8HU1FQwMjIS2rZtK+zfv7/Y+yOitxMJQilnERIRERG9BzhMRkRERFqNyRARERFpNSZDREREpNWYDBEREZFWYzJEREREWo3JEBEREWk1JkNERESk1ZgMERERkVZjMkRERERajckQERERaTUmQ0RERKTVmAwRERGRVvs/SPwvxgAe3J4AAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "true_labels = df[\"is_hallucination\"].map(HALLUCINATION_PROMPT_RAILS_MAP).tolist()\n",
    "\n",
    "print(classification_report(true_labels, hallucination_classifications, labels=rails))\n",
    "confusion_matrix = ConfusionMatrix(\n",
    "    actual_vector=true_labels,\n",
    "    predict_vector=hallucination_classifications,\n",
    "    classes=rails,\n",
    ")\n",
    "confusion_matrix.plot(\n",
    "    cmap=plt.colormaps[\"Blues\"],\n",
    "    number_label=True,\n",
    "    normalized=True,\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Preview: GPT-4 Turbo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The `model_name` field is deprecated. Use `model` instead.                 This will be removed in a future release.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4f2acf95cd944403bff76be580b6a9ab",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "llm_classify |          | 0/100 (0.0%) | ⏳ 00:00<? | ?it/s"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "rails = list(HALLUCINATION_PROMPT_RAILS_MAP.values())\n",
    "hallucination_classifications = llm_classify(\n",
    "    dataframe=df,\n",
    "    template=HALLUCINATION_PROMPT_TEMPLATE,\n",
    "    model=OpenAIModel(model_name=\"gpt-4-turbo-preview\", temperature=0.0),\n",
    "    rails=rails,\n",
    "    concurrency=20,\n",
    ")[\"label\"].tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "hallucinated       0.90      0.74      0.81        50\n",
      "     factual       0.78      0.92      0.84        50\n",
      "\n",
      "    accuracy                           0.83       100\n",
      "   macro avg       0.84      0.83      0.83       100\n",
      "weighted avg       0.84      0.83      0.83       100\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Confusion Matrix (Normalized)'}, xlabel='Predicted Classes', ylabel='Actual Classes'>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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s2cPdu/ejbp168qVOzs7c2s9ERHRu0KkhmeLqfj2fv36ISsrC2FhYUhPT4ebmxvi4+Nli6pTUlIgFv87jmNnZ4fdu3dj1KhRaN68OWxtbTFixAiMHz9epX5VToby8/PlRoSKPXjwQG0LooiIiKhqVdVT64cPH47hw4crPZeYmKhQ5uXlhWPHjqne0X+oPE3WoUMH2eM4gJdZo1QqxZw5c9CpU6cKBUNERET0pqk8MjRnzhx07twZf//9N4qKijBu3DhcvHgRDx48wJEjRyojRiIiInrDRP//X0XbqA5UHhlq2rQprl27hvbt26NXr17Iz89Hnz59cObMGTg6OlZGjERERPSGvendZFWpXPcZMjExwaRJk9QdCxEREdEbp/LIUHx8PA4fPix7vXTpUri5uWHAgAF4+PChWoMjIiKiqlF808WKHtWBysnQ2LFjkZubCwA4f/48QkND4efnh9u3byM0NFTtARIREdGbV7ybrKJHdaDyNNnt27fh4uICAPjll1/Qs2dPzJw5E6dPn4afn5/aAyQiIiKqTCqPDOno6KCgoAAAsG/fPnTt2hUAYGZmJhsxIiIioupNLBKp5agOVB4Zat++PUJDQ9GuXTucOHECmzZtAvDyWSCv3pWaiIiIqqequuliVVB5ZOj7779HjRo1sHXrVixbtgy2trYAgD///BPdunVTe4BERET05mnSAmqVR4bq1auHnTt3KpQvXLhQLQERERERvUkqjwydPn0a58+fl73+9ddf4e/vj4kTJ6KoqEitwREREVHV0KTdZConQ0OGDMG1a9cAALdu3cJnn30GAwMDbNmyBePGjVN7gERERPTmadICapWToWvXrsHNzQ0AsGXLFrz//vvYsGEDYmNj8csvv6g7PiIiIqJKpfKaIUEQIJVKAbzcWt+jRw8AgJ2dHbKzs9UbHREREVUJ0f8fFW2jOlA5GfLw8MD06dPh4+ODAwcOYNmyZQBe3ozRyspK7QESERHRm6eO3WDVZTeZytNk0dHROH36NIYPH45JkybByckJALB161a0bdtW7QESERERVSaVR4aaN28ut5us2Ny5c6GlpaWWoIiIiKhqiUUvj4q2UR2onAyVRE9PT11NERERURXTpGkylZMhiUSChQsXYvPmzUhJSVG4t9CDBw/UFhwRERFRZVN5zVBERAQWLFiAfv364fHjxwgNDUWfPn0gFosxderUSgiRiIiIqoIm3HARKEcytH79eqxcuRKjR49GjRo10L9/f/z4448ICwvDsWPHKiNGIiIiesM06dlkKidD6enpaNasGQDAyMgIjx8/BgD06NEDu3btUm90REREVCWKF1BX9KgOVE6G6tati7S0NACAo6Mj9uzZAwA4efIkdHV11RsdERERUSVTORnq3bs3EhISAAD/+9//MGXKFDg7OyMgIABfffWV2gMkIiKiN0+TpslU3k02a9Ys2b/79euHevXqISkpCc7OzujZs6dagyMiIqKqwcdxqMDLywteXl7qiIWIiIjojStTMvTbb7+VucGPPvqo3MEQERHR20EsEkFcwWmuir7/TSlTMuTv71+mxkQiESQSSUXiISIioreAOu4VVE1yobIlQ1KptLLjICIiIqoSans2GREREb07NOnZZGXeWr9//364uLggNzdX4dzjx4/x3nvv4eDBg2oNjoiIiKpGRR/FUZ0eyVHmZCg6OhohISEwNjZWOGdiYoIhQ4Zg4cKFag2OiIiIqLKVORk6e/YsunXrVuL5rl274tSpU2oJioiIiKpW8W6yih6qWrp0KRwcHKCnpwdPT0+cOHGixLqxsbEKN3nU09NT/VrLWjEjIwPa2tolnq9RowaysrJUDoCIiIjePlUxTbZp0yaEhoYiPDwcp0+fhqurK3x9fZGZmVnie4yNjZGWliY77t69q/K1ljkZsrW1xYULF0o8f+7cOdjY2KgcABEREb19quJxHAsWLEBISAiCg4Ph4uKCmJgYGBgYYPXq1aXGaW1tLTusrKxUvtYyJ0N+fn6YMmUKnj17pnDu6dOnCA8PR48ePVQOgIiIiN5tubm5ckdhYaFCnaKiIpw6dQo+Pj6yMrFYDB8fHyQlJZXYdl5eHuzt7WFnZ4devXrh4sWLKsdX5q31kydPxrZt29CwYUMMHz4cjRo1AgBcuXIFS5cuhUQiwaRJk1QOgKrGuXkfKV0MT/QuqNVqeFWHQFRpBEnRG+lHjHI8zV1JGwBgZ2cnVx4eHo6pU6fKlWVnZ0MikSiM7FhZWeHKlStK22/UqBFWr16N5s2b4/Hjx5g3bx7atm2Lixcvom7dumWOs8zJkJWVFY4ePYqhQ4diwoQJEAQBwMvhKV9fXyxdurRcQ1NERET09lHnfYZSU1Pl/gDX1dWtULvFXn0+atu2bdGkSRMsX74c06ZNK3M7Kt100d7eHn/88QcePnyIGzduQBAEODs7o1atWqo0Q0RERBrE2Nj4tbMR5ubm0NLSQkZGhlx5RkYGrK2ty9SPtrY2WrRogRs3bqgUX7lGwGrVqoVWrVqhdevWTISIiIjeQSIRIK7gocrAko6ODtzd3ZGQkCArk0qlSEhIkBv9KY1EIsH58+dV3tDFx3EQERGRguKEpqJtqCI0NBSBgYHw8PBA69atER0djfz8fAQHBwMAAgICYGtri6ioKABAZGQk2rRpAycnJzx69Ahz587F3bt3MWjQIJX6ZTJEREREb4V+/fohKysLYWFhSE9Ph5ubG+Lj42VrklNSUiAW/zup9fDhQ4SEhCA9PR21atWCu7s7jh49ChcXF5X6FQnFK6FJI+Tm5sLExAQZOY+5m4zeWdxNRu8yQVKEwvMr8fhx5fwcL/498c3Gv6FrYFShtgoL8rD0M49Ki1VdODJERERECqpimqyqlCkZ+u2338rc4EcffVTuYIiIiIjetDIlQ/7+/mVqTCQSQSKRVCQeIiIieguU59liytqoDsqUDEml0sqOg4iIiN4i5X3q/KttVAdcM0REREQK1Pk4jrdduZKh/Px8HDhwACkpKSgqkn9GyrfffquWwIiIiIjeBJWToTNnzsDPzw8FBQXIz8+HmZkZsrOzYWBgAEtLSyZDRERE7wBNWjOk8gjWqFGj0LNnTzx8+BD6+vo4duwY7t69C3d3d8ybN68yYiQiIqI3TAyRbN1QuQ9Uj2xI5WQoOTkZo0ePhlgshpaWFgoLC2FnZ4c5c+Zg4sSJlREjERERUaVRORnS1taW3Qrb0tISKSkpAAATExOkpqaqNzoiIiKqEsXTZBU9qgOV1wy1aNECJ0+ehLOzM7y9vREWFobs7GzExcWhadOmlREjERERvWGadAdqlUeGZs6cCRsbGwDAjBkzUKtWLQwdOhRZWVlYsWKF2gMkIiIiqkwqjwx5eHjI/m1paYn4+Hi1BkRERERVTySq+E0T39lpMiIiInr3adLWepWTofr160NUytXdunWrQgERERERvUkqJ0MjR46Ue/38+XOcOXMG8fHxGDt2rLriIiIioiqkSQuoVU6GRowYobR86dKl+PvvvyscEBEREVU90f//V9E2qgO1PUPtww8/xC+//KKu5oiIiKgKFY8MVfSoDtSWDG3duhVmZmbqao6IiIjojSjXTRf/u4BaEASkp6cjKysLP/zwg1qDIyIioqrBNUOl6NWrl1wyJBaLYWFhgY4dO6Jx48ZqDY6IiIiqhkgkKnX3eFnbqA5UToamTp1aCWEQERERVQ2V1wxpaWkhMzNToTwnJwdaWlpqCYqIiIiqliYtoFZ5ZEgQBKXlhYWF0NHRqXBAREREVPV4B2olFi9eDODl/N+PP/4IIyMj2TmJRIKDBw9yzRARERFVO2VOhhYuXAjg5chQTEyM3JSYjo4OHBwcEBMTo/4IiYiI6I0Ti0QVflBrRd//ppQ5Gbp9+zYAoFOnTti2bRtq1apVaUERERFR1eLW+lL89ddflREHERERUZVQeTfZxx9/jNmzZyuUz5kzB5988olagiIiIqIqJvp3EXV5j2ryaDLVk6GDBw/Cz89PofzDDz/EwYMH1RIUERERVS0xRGo5qgOVp8ny8vKUbqHX1tZGbm6uWoIiIiKiqqVJW+tVHhlq1qwZNm3apFC+ceNGuLi4qCUoIiIiojdF5ZGhKVOmoE+fPrh58yY++OADAEBCQgJ+/vlnbNmyRe0BEhER0ZunSbvJVB4Z6tmzJ3bs2IEbN25g2LBhGD16NP755x/s27cP/v7+lRAiERERvWnF9xmq6KGqpUuXwsHBAXp6evD09MSJEyfK9L6NGzdCJBKVKxdReWQIALp3747u3bsrlF+4cAFNmzYtT5NERESk4TZt2oTQ0FDExMTA09MT0dHR8PX1xdWrV2FpaVni++7cuYMxY8agQ4cO5epX5ZGhVz158gQrVqxA69at4erqWtHmiIiI6C1Q0W315VmAvWDBAoSEhCA4OBguLi6IiYmBgYEBVq9eXeJ7JBIJPv/8c0RERKBBgwblutZyJ0MHDx5EQEAAbGxsMG/ePHzwwQc4duxYeZsjIiKit4gYapgm+/+t9bm5uXJHYWGhQn9FRUU4deoUfHx8/o1BLIaPjw+SkpJKjDMyMhKWlpYYOHBgua9VpWmy9PR0xMbGYtWqVcjNzcWnn36KwsJC7NixgzvJiIiISCk7Ozu51+Hh4Zg6dapcWXZ2NiQSCaysrOTKrayscOXKFaXtHj58GKtWrUJycnKF4itzMtSzZ08cPHgQ3bt3R3R0NLp16wYtLS0+nJWIiOgdpM77DKWmpsLY2FhWrqurW7GG8XKZzpdffomVK1fC3Ny8Qm2VORn6888/8e2332Lo0KFwdnauUKdERET0dhOj4guLi99vbGwslwwpY25uDi0tLWRkZMiVZ2RkwNraWqH+zZs3cefOHfTs2VNWJpVKAQA1atTA1atX4ejoqFKcr3X48GE8efIE7u7u8PT0xPfff4/s7Oyyvp2IiIioRDo6OnB3d0dCQoKsTCqVIiEhAV5eXgr1GzdujPPnzyM5OVl2fPTRR+jUqROSk5MVpuZKU+aRoTZt2qBNmzaIjo7Gpk2bsHr1aoSGhkIqlWLv3r2ws7NDzZo1y9wxERERvb1EIhFEFZwnU/X9oaGhCAwMhIeHB1q3bo3o6Gjk5+cjODgYABAQEABbW1tERUVBT09P4XY+pqamAKDybX5UHgEzNDTEV199hcOHD+P8+fMYPXo0Zs2aBUtLS3z00UeqNkdERERvIZGaDlX069cP8+bNQ1hYGNzc3JCcnIz4+HjZouqUlBSkpaVV+NpeJRIEQahoIxKJBL///jtWr16N3377TR1xUSXJzc2FiYkJMnIev3b+lqi6qtVqeFWHQFRpBEkRCs+vxOPHlfNzvPj3xIrES9A3qtiMz9O8Jxjc0aXSYlWXCt90EQC0tLTg7+/PRIiIiIiqnXI9joOIiIjefdXkOasVxmSIiIiIFKjzPkNvO7VMkxERERFVVxwZIiIiIgVVsbW+qjAZIiIiIgXqvAP12666xElERERUKTgyRERERAo4TUZEREQarTx3kFbWRnXAaTIiIiLSaBwZIiIiIgWcJiMiIiKNpkm7yZgMERERkQJNGhmqLkkbERERUaXgyBAREREp0KTdZEyGiIiISAEf1EpERESkITgyRERERArEEEFcwYmuir7/TWEyRERERAo4TUZERESkITgyRERERApE//9fRduoDpgMERERkQJOkxERERFpCI4MERERkQKRGnaTcZqMiIiIqi1NmiZjMkREREQKNCkZ4pohIiIi0mgcGSIiIiIF3FpPREREGk0senlUtI3qgNNkREREpNE4MkREREQKOE1GREREGo27yYiIiIg0BJMhIiIiUiDCv1Nl5f9PdUuXLoWDgwP09PTg6emJEydOlFh327Zt8PDwgKmpKQwNDeHm5oa4uDiV+2QyRERERAqKd5NV9FDFpk2bEBoaivDwcJw+fRqurq7w9fVFZmam0vpmZmaYNGkSkpKScO7cOQQHByM4OBi7d+9W7VpVC5OIiIiocixYsAAhISEIDg6Gi4sLYmJiYGBggNWrVyut37FjR/Tu3RtNmjSBo6MjRowYgebNm+Pw4cMq9ctkSAlBEDB48GCYmZlBJBIhOTm5qkMqUVBQEPz9/as6DI2ycvMBNP8oDNbtRsInaC5OXbxTav0d+06jdd9psG43Em0/m4E9Ry7Knc8rKMTYOZvxXvfJsGk/Cm0+nY7VvxyqxCsgKt2gT97H2V8jkHZ4IfauGYOWLvYl1q2hJcbYQd1wens40g4vxKH136GzVxO5OqOCuiJh7VikJM7Dtd1RWDc3BE72lpV9GVRBFZ8i+3eiLDc3V+4oLCxU6K+oqAinTp2Cj4+PrEwsFsPHxwdJSUmvjVcQBCQkJODq1at4//33VbpWJkNKxMfHIzY2Fjt37kRaWhqaNm1aofamTp0KNzc39QRHVWrbnlOYHL0d4wd9iMS48WjqbIuP/7cUWQ+eKK1//OwtDJociy96eeHAuu/Q3dsVX4xZgUs37svqTF74CxKSLmF5ZACOb56Mrz/riHFzt+CPA+fe1GURyfTu0hLTR/bG7B//RMcvZ+PC9Xv4Zck3MK9lpLT+5KE9EdS7PcbP3YI2/aZjzbbDiJsTgmYN68rqtG3phB+3HETXr+ahz/DvoV1DC9uWDIeBns6buiwqh+LdZBU9AMDOzg4mJiayIyoqSqG/7OxsSCQSWFlZyZVbWVkhPT29xDgfP34MIyMj6OjooHv37liyZAm6dOmi0rUyGVLi5s2bsLGxQdu2bWFtbY0aNXgHAnrphw37EeDfFp9/5IXGDWywYMJnMNDTwbrflP/VsnxjIjp7NcG3X/qgUX1rTBraA66N7bByywFZnePnbqN/d0+0d2+IenVqI6hPezR1tsXpS3ff1GURyQwb8AF+2nEUG34/hqu30xEatREFz4rwxUdeSut/6tcaC2P3YO/RS7h7LwerfzmMvUcvYfgXH8jqfPLtD/h553FcuZWOC9fvYVjEOtjZmMGtid2buiwqB5GaDgBITU3F48ePZceECRPUFmfNmjWRnJyMkydPYsaMGQgNDUViYqJKbTAZekVQUBD+97//ISUlBSKRCA4ODoiPj0f79u1hamqK2rVro0ePHrh586bc+/755x/0798fZmZmMDQ0hIeHB44fP47Y2FhERETg7NmzEIlEEIlEiI2NxZ07dxSm4B49egSRSCT7IkokEgwcOBD169eHvr4+GjVqhEWLFr3BT4P+q+j5CyRfSUXH1o1kZWKxGN6tG+Hk+dtK33Pi/G10bNVYruyDNk1w8vwd2WvP5vXx58HzuJ/5CIIg4NDf13AzJROdPJuA6E3SrqEFt8Z2SDxxVVYmCAIOnLiKVs3qK32PrnYNPCt8Llf2rLAIbVwdS+zH2EgPAPAwt0ANUVN1YGxsLHfo6uoq1DE3N4eWlhYyMjLkyjMyMmBtbV1i22KxGE5OTnBzc8Po0aPRt29fpSNPpeGQxysWLVoER0dHrFixAidPnoSWlhYOHjyI0NBQNG/eHHl5eQgLC0Pv3r2RnJwMsViMvLw8eHt7w9bWFr/99husra1x+vRpSKVS9OvXDxcuXEB8fDz27dsHADAxMVH4YisjlUpRt25dbNmyBbVr18bRo0cxePBg2NjY4NNPPy3T9RQWFsrNzebm5pbvgyHkPMqDRCKFhVlNuXILM2Ncv6P865mZkwuL2q/Wr4nMnH+/DrPHfoKRM3/Ge90no4aWGGKxGIsm9Ue7lk7qvwiiUtQ2NUKNGloK075ZD3Lh7GCl9D37j13GsM8/wNEzN3D7n2x4t2qEHp3coFXCNiKRSISo0L44lnwTl2+mqf0aSH3EEEFcwbsmilXYXK+jowN3d3ckJCTI1sJKpVIkJCRg+PDhZW5HKpUqXZNUGiZDrzAxMUHNmjWhpaUly0Q//vhjuTqrV6+GhYUFLl26hKZNm2LDhg3IysrCyZMnYWZmBgBwcvr3F5mRkRFq1KhRamarjLa2NiIiImSv69evj6SkJGzevLnMyVBUVJRcG/T2WbHpAP4+fwcb5g+BnY0Zjp65gbFzNsPa3AQdPRu/vgGiKvTd/K1YNKk/TmyZAkEQcPteNjb8fgyf92yjtP68cZ+iiaMNPgxZ+IYjJVX9d5qrIm2oIjQ0FIGBgfDw8EDr1q0RHR2N/Px8BAcHAwACAgJga2srG/mJioqCh4cHHB0dUVhYiD/++ANxcXFYtmyZSv0yGSqD69evIywsDMePH0d2djakUikAICUlBU2bNkVycjJatGghS4TUaenSpVi9ejVSUlLw9OlTFBUVqbQYe8KECQgNDZW9zs3NhZ0d5+nLo7apEbS0xEr/arasbaz0PZa1jZGV82r9J7L6T58VYdoPvyNubgh8279cqN/U2RYXrv2D79clMBmiNyrnUR5evJAoHf3872jmq+/5YuxK6OrUgJmJIdKyHmPq8F64cz9Hoe6csZ/At0NT+A2Oxv3MR5VxCVTN9evXD1lZWQgLC0N6ejrc3NwQHx8vW1SdkpICsfjfFT75+fkYNmwY/vnnH+jr66Nx48ZYt24d+vXrp1K/XDNUBj179sSDBw+wcuVKHD9+HMePHwfwchsgAOjr66vcZvEXUxAEWdnz5/Lz7hs3bsSYMWMwcOBA7NmzB8nJyQgODpb1Wxa6uroKc7VUPjraNeDW2A4HTv67nkIqleLgyWslrqdo3ay+XH0A+Ov4FbRq5gAAeP5CgucvJApD0WKxGNL/fG8QvQnPX0iQfCUV3q3+XRcnEonwfquGJa6LK1ZY9AJpWY9RQ0uMnh+44c9XdkPOGfsJund0xUdDFyNFSaJEbyF1rqBWwfDhw3H37l0UFhbi+PHj8PT0lJ1LTExEbGys7PX06dNx/fp1PH36FA8ePMDRo0dVToQAjgy9Vk5ODq5evYqVK1eiQ4cOAKBwM6fmzZvjxx9/xIMHD5SODuno6EAikciVWVhYAADS0tLQokULAFC4n9GRI0fQtm1bDBs2TFb26sJterOGDfgAwyLi0KJJPbR8zwHLfv4L+U8LZVMCX4f/BBsLE4QP7wUAGPJZR/QYEo3v1yWga/v3sG3PKSRfTkH0xP4AAGMjfbRr6YSwxTugr6cNO2szHDl9A5v+OIHpI/tU2XWS5vphw378EP4lzlxOwemLdzC0fycY6uti/e/HAADLpn6JtKzHiFz6GwDA/T172Fia4vy1f1DHwhTjB/tBLBZh0U/7ZG3OG/8p+vp6YMCYFcgreAbL/19Hl5v3TGHxNb09+NR6kqlVqxZq166NFStWwMbGBikpKfjuu+/k6vTv3x8zZ86Ev78/oqKiYGNjgzNnzqBOnTrw8vKCg4MDbt++jeTkZNStWxc1a9aEvr4+2rRpg1mzZqF+/frIzMzE5MmT5dp1dnbGTz/9hN27d6N+/fqIi4vDyZMnUb++8lEIqnx9uroj+1EeZi7fhcycJ2jW0BZbF38jm/b6J/2B3CiPp2sDrJwehBnLdmLaD7+jgZ0F1s0bDBenOrI6q2Z8hcilv2LwlLV4mFsAO2szTB7aA1993P6NXx/R9r2nYW5qhIlDusOydk2cv3YPfb/9915ada3N5EYtdXW1MenrHnCwNUf+00LsPXIRX4f9hNy8p7I6A/u+vAHeruUj5foaFhGHn3cer/yLInoNkSBwLP5V0dHRiI6Oxp07dwAA+/btw7fffotbt26hUaNGWLx4MTp27Ijt27fLVrzfvXsXo0ePxt69e/HixQu4uLhg6dKlaN26NQoLC/H5558jISEBjx49wpo1axAUFITLly9j4MCBSE5ORqNGjTBnzhx07doVf/31Fzp27IjCwkJ8/fXX2L59O0QiEfr37w8TExP8+eefslGkoKAgPHr0CDt27CjTteXm5r7czZbzmFNm9M6q1arsO0+IqhtBUoTC8yvx+HHl/Bwv/j2RkJwCo5oVaz/vSS46u9WrtFjVhcmQhmEyRJqAyRC9y95UMrRfTcnQB9UgGeICaiIiItJoXDNEREREiqriRkNVhMkQERERKeBuMiIiItJo/33qfEXaqA64ZoiIiIg0GkeGiIiISIEGLRliMkRERERKaFA2xGkyIiIi0mgcGSIiIiIF3E1GREREGo27yYiIiIg0BEeGiIiISIEGrZ9mMkRERERKaFA2xGkyIiIi0mgcGSIiIiIF3E1GREREGk2TdpMxGSIiIiIFGrRkiGuGiIiISLNxZIiIiIgUadDQEJMhIiIiUqBJC6g5TUZEREQajSNDREREpIC7yYiIiEijadCSIU6TERERkWbjyBAREREp0qChISZDREREpIC7yYiIiIg0BEeGiIiISAF3kxEREZFG06AlQ5wmIyIiIiVEajpUtHTpUjg4OEBPTw+enp44ceJEiXVXrlyJDh06oFatWqhVqxZ8fHxKrV8SJkNERET0Vti0aRNCQ0MRHh6O06dPw9XVFb6+vsjMzFRaPzExEf3798dff/2FpKQk2NnZoWvXrrh3755K/TIZIiIiIgUiNf2nigULFiAkJATBwcFwcXFBTEwMDAwMsHr1aqX1169fj2HDhsHNzQ2NGzfGjz/+CKlUioSEBJX6ZTJEREREikT/LqIu71GcC+Xm5sodhYWFCt0VFRXh1KlT8PHxkZWJxWL4+PggKSmpTCEXFBTg+fPnMDMzU+lSmQwRERFRpbKzs4OJiYnsiIqKUqiTnZ0NiUQCKysruXIrKyukp6eXqZ/x48ejTp06cglVWXA3GRERESlQ526y1NRUGBsby8p1dXUr2LKiWbNmYePGjUhMTISenp5K72UyRERERIrUmA0ZGxvLJUPKmJubQ0tLCxkZGXLlGRkZsLa2LvW98+bNw6xZs7Bv3z40b95c5TA5TUZERERVTkdHB+7u7nKLn4sXQ3t5eZX4vjlz5mDatGmIj4+Hh4dHufrmyBAREREpqIpnk4WGhiIwMBAeHh5o3bo1oqOjkZ+fj+DgYABAQEAAbG1tZWuOZs+ejbCwMGzYsAEODg6ytUVGRkYwMjIqc79MhoiIiEhBVTyOo1+/fsjKykJYWBjS09Ph5uaG+Ph42aLqlJQUiMX/TmotW7YMRUVF6Nu3r1w74eHhmDp1apn7ZTJEREREb43hw4dj+PDhSs8lJibKvb5z545a+mQyRERERAo06dlkTIaIiIhIkQZlQ0yGiIiISEFVLKCuKtxaT0RERBqNI0NERESkQAQ17CZTSySVj8kQERERKdCgJUOcJiMiIiLNxpEhIiIiUlAVN12sKkyGiIiISAnNmSjjNBkRERFpNI4MERERkQJOkxEREZFG05xJMk6TERERkYbjyBAREREp4DQZERERaTRNejYZkyEiIiJSpEGLhrhmiIiIiDQaR4aIiIhIgQYNDDEZIiIiIkWatICa02RERESk0TgyRERERAq4m4yIiIg0mwYtGuI0GREREWk0jgwRERGRAg0aGGIyRERERIq4m4yIiIhIQ3BkiIiIiJSo+G6y6jJRxmSIiIiIFHCajIiIiEhDMBkiIiIijcZpMiIiIlKgSdNkTIaIiIhIgSY9joPTZERERKTRmAwRERGRguJpsooeqlq6dCkcHBygp6cHT09PnDhxosS6Fy9exMcffwwHBweIRCJER0eX61qZDBEREZECkZoOVWzatAmhoaEIDw/H6dOn4erqCl9fX2RmZiqtX1BQgAYNGmDWrFmwtrZW+RqLMRkiIiKit8KCBQsQEhKC4OBguLi4ICYmBgYGBli9erXS+q1atcLcuXPx2WefQVdXt9z9MhkiIiIiRWocGsrNzZU7CgsLFborKirCqVOn4OPjIysTi8Xw8fFBUlJSJV3k//dTqa0TERFRtSRS038AYGdnBxMTE9kRFRWl0F92djYkEgmsrKzkyq2srJCenl6p18qt9URERFSpUlNTYWxsLHtdkSmtysBkiIiIiBSo86aLxsbGcsmQMubm5tDS0kJGRoZceUZGRoUWR5cFp8mIiIhIwZveTaajowN3d3ckJCTIyqRSKRISEuDl5VXh6ykNR4aIiIhIUXn2xitrQwWhoaEIDAyEh4cHWrdujejoaOTn5yM4OBgAEBAQAFtbW9mao6KiIly6dEn273v37iE5ORlGRkZwcnIqc79MhoiIiOit0K9fP2RlZSEsLAzp6elwc3NDfHy8bFF1SkoKxOJ/J7Xu37+PFi1ayF7PmzcP8+bNg7e3NxITE8vcL5MhIiIiUlBVzyYbPnw4hg8frvTcqwmOg4MDBEEoT2hymAwRERGRAj61nt5ZxRn0k9zcKo6EqPIIkqKqDoGo0hR/f6tjRKQ0uWr4PaGONt4EJkMa5smTJwAAp/p2VRwJERFVxJMnT2BiYqL2dnV0dGBtbQ1nNf2esLa2ho6OjlraqiwiobJTS3qrSKVS3L9/HzVr1oSouoxfVmO5ubmws7NTuOEY0buC3+NvniAIePLkCerUqSO3mFidnj17hqIi9Yyw6ujoQE9PTy1tVRaODGkYsViMunXrVnUYGqcsNxwjqs74Pf5mVcaI0H/p6em99QmMOvGmi0RERKTRmAwRERGRRmMyRFSJdHV1ER4e/tY9lJBIXfg9Tu8CLqAmIiIijcaRISIiItJoTIaIiIhIozEZIiIiIo3GZIiqtY4dO2LkyJHlfn9sbCxMTU1lr6dOnQo3N7cKx1UsMTERIpEIjx49Ulub6iYSibBjx46qDoMqmSAIGDx4MMzMzCASiZCcnFzVIZUoKCgI/v7+VR0GaRAmQ0SVqG3btkhLS1P7DdKYwJCq4uPjERsbi507dyItLQ1NmzatUHvq/sOBqCrxDtRElaj4GT9EVe3mzZuwsbFB27ZtqzoUorcOR4ao2pNKpRg3bhzMzMxgbW2NqVOnys4tWLAAzZo1g6GhIezs7DBs2DDk5eWVuW1l03D+/v4ICgqSvS4sLMT48eNhZ2cHXV1dODk5YdWqVQAUp8mKp+V2796NJk2awMjICN26dUNaWpqsvZMnT6JLly4wNzeHiYkJvL29cfr0adl5BwcHAEDv3r0hEolkrwHg119/RcuWLaGnp4cGDRogIiICL168kJ2/fv063n//fejp6cHFxQV79+4t82dB1VdQUBD+97//ISUlRfY9Ex8fj/bt28PU1BS1a9dGjx49cPPmTbn3/fPPP+jfvz/MzMxgaGgIDw8PHD9+HLGxsYiIiMDZs2chEokgEokQGxuLO3fuKEzBPXr0CCKRCImJiQAAiUSCgQMHon79+tDX10ejRo2waNGiN/hpECliMkTV3tq1a2FoaIjjx49jzpw5iIyMlP2SF4vFWLx4MS5evIi1a9di//79GDdunFr7DwgIwM8//4zFixfj8uXLWL58OYyMjEqsX1BQgHnz5iEuLg4HDx5ESkoKxowZIzv/5MkTBAYG4vDhwzh27BicnZ3h5+eHJ0+eAHiZLAHAmjVrkJaWJnt96NAhBAQEYMSIEbh06RKWL1+O2NhYzJgxA8DLpLFPnz7Q0dHB8ePHERMTg/Hjx6v1s6C306JFixAZGYm6devKvmfy8/MRGhqKv//+GwkJCRCLxejduzekUikAIC8vD97e3rh37x5+++03nD17FuPGjYNUKkW/fv0wevRovPfee0hLS0NaWhr69etXplikUinq1q2LLVu24NKlSwgLC8PEiROxefPmyvwIiEonEFVj3t7eQvv27eXKWrVqJYwfP15p/S1btgi1a9eWvV6zZo1gYmIiex0eHi64urrKtT9ixAi5Nnr16iUEBgYKgiAIV69eFQAIe/fuVdrfX3/9JQAQHj58KOsPgHDjxg1ZnaVLlwpWVlYlXqNEIhFq1qwp/P7777IyAML27dvl6nXu3FmYOXOmXFlcXJxgY2MjCIIg7N69W6hRo4Zw79492fk///xTaVv07lm4cKFgb29f4vmsrCwBgHD+/HlBEARh+fLlQs2aNYWcnByl9V/9/4ogCMLt27cFAMKZM2dkZQ8fPhQACH/99VeJfX/zzTfCxx9/LHsdGBgo9OrV63WXRKQ2XDNE1V7z5s3lXtvY2CAzMxMAsG/fPkRFReHKlSvIzc3Fixcv8OzZMxQUFMDAwKDCfScnJ0NLSwve3t5lfo+BgQEcHR2VxgsAGRkZmDx5MhITE5GZmQmJRIKCggKkpKSU2u7Zs2dx5MgR2UgQ8HJKovh6L1++DDs7O9SpU0d23svLq8xx07vl+vXrCAsLw/Hjx5GdnS0bEUpJSUHTpk2RnJyMFi1awMzMTO19L126FKtXr0ZKSgqePn2KoqIiLsamKsVkiKo9bW1tudcikQhSqRR37txBjx49MHToUMyYMQNmZmY4fPgwBg4ciKKiojIlQ2KxGMIrT6x5/vy57N/6+vpqife/fQQGBiInJweLFi2Cvb09dHV14eXlhaKiolLbzcvLQ0REBPr06aNwTk9PT+U46d3Ws2dP2NvbY+XKlahTpw6kUimaNm0q+z4rz/e2WPxy5cV/v5//+/8XANi4cSPGjBmD+fPnw8vLCzVr1sTcuXNx/PjxClwNUcUwGaJ31qlTpyCVSjF//nzZD2lV1yVYWFjILW6WSCS4cOECOnXqBABo1qwZpFIpDhw4AB8fH7XEfeTIEfzwww/w8/MDAKSmpiI7O1uujra2NiQSiVxZy5YtcfXqVTg5OSltt0mTJkhNTUVaWhpsbGwAAMeOHVNLzFS95OTk4OrVq1i5ciU6dOgAADh8+LBcnebNm+PHH3/EgwcPlI4O6ejoKHwPWlhYAADS0tLQokULAFC4n9GRI0fQtm1bDBs2TFb26sJtojeNC6jpneXk5ITnz59jyZIluHXrFuLi4hATE6NSGx988AF27dqFXbt24cqVKxg6dKjcDRQdHBwQGBiIr776Cjt27MDt27eRmJhYocWgzs7OiIuLw+XLl3H8+HF8/vnnCn+lOzg4ICEhAenp6Xj48CEAICwsDD/99BMiIiJw8eJFXL58GRs3bsTkyZMBAD4+PmjYsCECAwNx9uxZHDp0CJMmTSp3nFR91apVC7Vr18aKFStw48YN7N+/H6GhoXJ1+vfvD2tra/j7++PIkSO4desWfvnlFyQlJQF4+T14+/ZtJCcnIzs7G4WFhdDX10ebNm0wa9YsXL58GQcOHJB9/xVzdnbG33//jd27d+PatWuYMmWKbBMAUVVhMkTvLFdXVyxYsACzZ89G06ZNsX79ekRFRanUxldffYXAwEAEBATA29sbDRo0kI0KFVu2bBn69u2LYcOGoXHjxggJCUF+fn654161ahUePnyIli1b4ssvv8S3334LS0tLuTrz58/H3r17YWdnJ/sL3NfXFzt37sSePXvQqlUrtGnTBgsXLoS9vT2Al1MY27dvx9OnT9G6dWsMGjRIbn0RaQ6xWIyNGzfi1KlTaNq0KUaNGoW5c+fK1dHR0cGePXtgaWkJPz8/NGvWDLNmzYKWlhYA4OOPP0a3bt3QqVMnWFhY4OeffwYArF69Gi9evIC7uztGjhyJ6dOny7U7ZMgQ9OnTB/369YOnpydycnLkRomIqoJIeHVBBBEREZEG4cgQERERaTQmQ0RERKTRmAwRERGRRmMyRERERBqNyRARERFpNCZDREREpNGYDBEREZFGYzJERGoVFBQEf39/2euOHTti5MiRbzyOxMREiEQiuTuGV2U7RPT2YjJEpAGCgoIgEokgEomgo6MDJycnREZG4sWLF5Xe97Zt2zBt2rQy1a2KxOPMmTP45JNPYGVlBT09PTg7OyMkJATXrl17YzEQUdViMkSkIbp164a0tDRcv34do0ePxtSpUxUewVCs+Mnl6mBmZoaaNWuqrT112rlzJ9q0aYPCwkKsX78ely9fxrp162BiYoIpU6ZUdXhE9IYwGSLSELq6urC2toa9vT2GDh0KHx8f/PbbbwD+ndqaMWMG6tSpg0aNGgEAUlNT8emnn8LU1BRmZmbo1asX7ty5I2tTIpEgNDQUpqamqF27NsaNG4dXn/Dz6jRZYWEhxo8fDzs7O+jq6sLJyQmrVq3CnTt3ZM99q1WrFkQiEYKCggAAUqkUUVFRqF+/PvT19eHq6oqtW7fK9fPHH3+gYcOG0NfXR6dOneTiVKagoADBwcHw8/PDb7/9Bh8fH9SvXx+enp6YN28eli9frvR9OTk56N+/P2xtbWFgYIBmzZrJnstVbOvWrWjWrBn09fVRu3Zt+Pj4yJ5Xl5iYiNatW8PQ0BCmpqZo164d7t69K3vvr7/+ipYtW0JPTw8NGjRARESEbARPEARMnToV9erVg66uLurUqYNvv/221OskoterUdUBEFHV0NfXR05Ojux1QkICjI2NsXfvXgDA8+fP4evrCy8vLxw6dAg1atTA9OnT0a1bN5w7dw46OjqYP38+YmNjsXr1ajRp0gTz58/H9u3b8cEHH5TYb0BAAJKSkrB48WK4urri9u3byM7Ohp2dHX755Rd8/PHHuHr1KoyNjaGvrw8AiIqKwrp16xATEwNnZ2ccPHgQX3zxBSwsLODt7Y3U1FT06dMH33zzDQYPHoy///4bo0ePLvX6d+/ejezsbIwbN07peVNTU6Xlz549g7u7O8aPHw9jY2Ps2rULX375JRwdHdG6dWukpaWhf//+mDNnDnr37o0nT57g0KFDEAQBL168gL+/P0JCQvDzzz+jqKgIJ06cgEgkAgAcOnQIAQEBWLx4MTp06ICbN29i8ODBAIDw8HD88ssvWLhwITZu3Ij33nsP6enpOHv2bKnXSURlIBDROy8wMFDo1auXIAiCIJVKhb179wq6urrCmDFjZOetrKyEwsJC2Xvi4uKERo0aCVKpVFZWWFgo6OvrC7t37xYEQRBsbGyEOXPmyM4/f/5cqFu3rqwvQRAEb29vYcSIEYIgCMLVq1cFAMLevXuVxvnXX38JAISHDx/Kyp49eyYYGBgIR48elas7cOBAoX///oIgCMKECRMEFxcXufPjx49XaOu/Zs+eLQAQHjx4oPR8aTG9qnv37sLo0aMFQRCEU6dOCQCEO3fuKNTLyckRAAiJiYlK2+ncubMwc+ZMubK4uDjBxsZGEARBmD9/vtCwYUOhqKio1JiJSDUcGSLSEDt37oSRkRGeP38OqVSKAQMGYOrUqbLzzZo1g46Ojuz12bNncePGDYX1Ps+ePcPNmzfx+PFjpKWlwdPTU3auRo0a8PDwUJgqK5acnAwtLS14e3uXOe4bN26goKAAXbp0kSsvKipCixYtAACXL1+WiwMAvLy8Sm23pBhfRyKRYObMmdi8eTPu3buHoqIiFBYWwsDAAADg6uqKzp07o1mzZvD19UXXrl3Rt29f1KpVC2ZmZggKCoKvry+6dOkCHx8ffPrpp7CxsQHw8jM/cuQIZsyYIdffs2fPUFBQgE8++QTR0dFo0KABunXrBj8/P/Ts2RM1avBHOVFF8P9BRBqiU6dOWLZsGXR0dFCnTh2FX6CGhoZyr/Py8uDu7o7169crtGVhYVGuGIqnvVSRl5cHANi1axdsbW3lzunq6pYrDgBo2LAhAODKlSuvTZz+a+7cuVi0aBGio6PRrFkzGBoaYuTIkbJF51paWti7dy+OHj2KPXv2YMmSJZg0aRKOHz+O+vXrY82aNfj2228RHx+PTZs2YfLkydi7dy/atGmDvLw8REREoE+fPgr96unpwc7ODlevXsW+ffuwd+9eDBs2DHPnzsWBAwegra1d7s+CSNNxATWRhjA0NISTkxPq1atXppGEli1b4vr167C0tISTk5PcYWJiAhMTE9jY2OD48eOy97x48QKnTp0qsc1mzZpBKpXiwIEDSs8Xj0xJJBJZmYuLC3R1dZGSkqIQh52dHQCgSZMmOHHihFxbx44dK/X6unbtCnNzc8yZM0fp+ZK29x85cgS9evXCF198AVdXVzRo0EBhG75IJEK7du0QERGBM2fOQEdHB9u3b5edb9GiBSZMmICjR4+iadOm2LBhA4CXn/nVq1cVrtPJyQli8csf1/r6+ujZsycWL16MxMREJCUl4fz586VeKxGVjskQESn1+eefw9zcHL169cKhQ4dw+/ZtJCYm4ttvv8U///wDABgxYgRmzZqFHTt24MqVKxg2bFip9whycHBAYGAgvvrqK+zYsUPW5ubNmwEA9vb2EIlE2LlzJ7KyspCXl4eaNWtizJgxGDVqFNauXYubN2/i9OnTWLJkCdauXQsA+Prrr3H9+nWMHTsWV69exYYNGxAbG1vq9RkaGuLHH3/Erl278NFHH2Hfvn24c+cO/v77b4wbNw5ff/210vc5OzvLRn4uX76MIUOGICMjQ3b++PHjmDlzJv7++2+kpKRg27ZtyMrKQpMmTXD79m1MmDABSUlJuHv3Lvbs2YPr16+jSZMmAICwsDD89NNPiIiIwMWLF3H58mVs3LgRkydPBgDExsZi1apVuHDhAm7duoV169ZBX18f9vb2ZfqaElEJqnrREhFVvv8uoFblfFpamhAQECCYm5sLurq6QoMGDYSQkBDh8ePHgiC8XDA9YsQIwdjYWDA1NRVCQ0OFgICAEhdQC4IgPH36VBg1apRgY2Mj6OjoCE5OTsLq1atl5yMjIwVra2tBJBIJgYGBgiC8XPQdHR0tNGrUSNDW1hYsLCwEX19f4cCBA7L3/f7774KTk5Ogq6srdOjQQVi9evVrFz4LgiCcPHlS6NOnj2BhYSHo6uoKTk5OwuDBg4Xr168LgqC4gDonJ0fo1auXYGRkJFhaWgqTJ0+Wu+ZLly4Jvr6+svYaNmwoLFmyRBAEQUhPTxf8/f1l125vby+EhYUJEolEFk98fLzQtm1bQV9fXzA2NhZat24trFixQhAEQdi+fbvg6ekpGBsbC4aGhkKbNm2Effv2lXp9RPR6IkEo5ypCIiIioncAp8mIiIhIozEZIiIiIo3GZIiIiIg0GpMhIiIi0mhMhoiIiEijMRkiIiIijcZkiIiIiDQakyEiIiLSaEyGiIiISKMxGSIiIiKNxmSIiIiINBqTISIiItJo/wdZQ6ulXTB0lQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "print(classification_report(true_labels, hallucination_classifications, labels=rails))\n",
    "confusion_matrix = ConfusionMatrix(\n",
    "    actual_vector=true_labels,\n",
    "    predict_vector=hallucination_classifications,\n",
    "    classes=rails,\n",
    ")\n",
    "confusion_matrix.plot(\n",
    "    cmap=plt.colormaps[\"Blues\"],\n",
    "    number_label=True,\n",
    "    normalized=True,\n",
    ")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
